package cn.iocoder.yudao.module.system.service.gugu;

import cn.iocoder.yudao.module.system.controller.admin.gugu.vo.MajorRecommendReqVO;
import cn.iocoder.yudao.module.system.controller.admin.gugu.vo.MajorRecommendRespVO;

import java.util.List;

/**
 * 智能推荐专业服务接口
 *
 * @author 芋道源码
 */
public interface MajorRecommendationService {

    /**
     * 智能推荐专业
     *
     * @param reqVO 推荐请求参数
     * @return 推荐结果
     */
    MajorRecommendRespVO recommendMajors(MajorRecommendReqVO reqVO);

    /**
     * 智能推荐专业（带用户ID）
     *
     * @param reqVO 推荐请求参数
     * @param userId 用户ID
     * @return 推荐结果
     */
    MajorRecommendRespVO recommendMajors(MajorRecommendReqVO reqVO, Long userId);

    /**
     * 计算专业录取概率
     *
     * @param userRank 用户位次
     * @param schoolUuid 学校UUID
     * @param majorName 专业名称
     * @param province 省份
     * @param year 年份
     * @param examType 考试类型
     * @return 录取概率（0-100）
     */
    Double calculateMajorAdmissionProbability(Integer userRank, String schoolUuid, String majorName, 
                                            String province, Integer year, String examType);

    /**
     * 判断推荐类型
     *
     * @param probability 录取概率
     * @return 推荐类型：CHONG（冲刺）、WENTUO（稳妥）、BAODI（保底）
     */
    String determineRecommendationType(Double probability);

    /**
     * 生成专业推荐理由
     *
     * @param schoolName 学校名称
     * @param majorName 专业名称
     * @param probability 录取概率
     * @param type 推荐类型
     * @param majorTags 专业标签
     * @return 推荐理由
     */
    String generateMajorRecommendationReason(String schoolName, String majorName, Double probability, 
                                           String type, List<String> majorTags);

    /**
     * 根据分数和一分一段表计算位次
     *
     * @param score 分数
     * @param province 省份
     * @param year 年份
     * @param examType 考试类型
     * @return 位次
     */
    Integer calculateRankByScore(Integer score, String province, Integer year, String examType);

    /**
     * 根据选科要求筛选专业
     *
     * @param subjects 用户选科
     * @param province 省份
     * @param year 年份
     * @param examType 考试类型
     * @param batch 批次
     * @return 符合选科要求的专业列表
     */
    List<String> filterMajorsBySubjects(List<String> subjects, String province, Integer year, 
                                      String examType, String batch);

    /**
     * 获取专业标签
     *
     * @param majorName 专业名称
     * @param schoolUuid 学校UUID
     * @return 专业标签列表
     */
    List<String> getMajorTags(String majorName, String schoolUuid);

    /**
     * 获取学校标签
     *
     * @param schoolUuid 学校UUID
     * @return 学校标签列表
     */
    List<String> getSchoolTags(String schoolUuid);
}
